package Comunicacion;

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Roberto
 */
public class Wrapper {

    Robot robot;

    public Wrapper() {
        try {
            this.robot = new Robot();
        } catch (AWTException ex) {
            Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Envia el evento de teclado correspondiente al entero de entrada
     * @param tecla evento a enviar
     */
    public void enviarTecla(int tecla) {
        robot.keyPress(tecla);
        robot.keyRelease(tecla);
    }

    /**
     * Captura la pantalla completa
     * @return la imagen capturada
     */
    public BufferedImage capturarPantalla() {
        retardo(2000);
        //rectangulo de toda la pantalla
        Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        //return robot.createScreenCapture(new Rectangle(0, 50, 650, 380));
        return robot.createScreenCapture(captureSize);
    }

    /**
     * Obtiene el número de registros del DOSBox  
     * @return número de resgistros
     */
    public String obtenerRegistros() {
        enviarTecla(KeyEvent.VK_4);
        BufferedImage imagen = capturarPantalla();
        String result = Parsear.registros(imagen);
        enviarTecla(KeyEvent.VK_ENTER);
        return result;
    }

    /**
     * Ordena el DOSBox por el campo cinta
     */
    public void ordenarPorCinta() {
        enviarTecla(KeyEvent.VK_3);
        enviarTecla(KeyEvent.VK_3);
        enviarTecla(KeyEvent.VK_ENTER);
        retardo(30000);
        enviarTecla(KeyEvent.VK_ENTER);
    }

    /**
     * Lanza los eventos de teclado oportunos para escribir una palabra
     * @param palabra 
     */
    public void enviarPalabra(String palabra) {
        for (int i = 0; i < palabra.length(); i++) {
            int letra = (int) palabra.charAt(i);
            enviarTecla(letra);
        }
    }

    /**
     * Obtiene del DOSBox los datos de un programa
     * @param nombrePrograma nombre del programa que se buscará en el DOSBox
     * @return los datos de ese programa, cadena vacía si ese programa no está.
     */
    public String obtenerDatosPrograma(String nombrePrograma) {
        retardo(1000);
        enviarTecla(KeyEvent.VK_7);
//        enviarTecla(KeyEvent.VK_CAPS_LOCK);
        robot.keyPress(KeyEvent.VK_SHIFT);
        retardo(1000);
        enviarTecla(KeyEvent.VK_N);
        retardo(1000);
        enviarTecla(KeyEvent.VK_ENTER);
        enviarPalabra(nombrePrograma);
        retardo(1000);
        enviarTecla(KeyEvent.VK_ENTER);

        BufferedImage imagen = capturarPantalla();
        //Parsear e identificar si esta o no esta el nombre de la aplicación

        String result = Parsear.datosDeUnPrograma(imagen, nombrePrograma);

        enviarTecla(KeyEvent.VK_ENTER);
        enviarTecla(KeyEvent.VK_ENTER);
        enviarTecla(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_SHIFT);
        return result;

    }

    /**
     * Obtiene del DOSBox los programas de una cinta
     * @param nombreCinta nombre de la cinta que se buscará en el DOSBox
     * @return lista con los programas de esa cinta 
     */
    public ArrayList<String> programasDeUnaCinta(String nombreCinta) {
        boolean hayMas;
        //retardo(3000);
        enviarTecla(KeyEvent.VK_6);
        enviarTecla(KeyEvent.VK_CAPS_LOCK);
        retardo(1000);
        enviarPalabra(nombreCinta.toUpperCase());
        enviarTecla(KeyEvent.VK_CAPS_LOCK);
        retardo(1000);
        enviarTecla(KeyEvent.VK_ENTER);

        ArrayList<String> datos = new ArrayList();
        do {
            retardo(500);
            BufferedImage imagen = capturarPantalla();

            hayMas = Parsear.datosDeUnaCinta(imagen, nombreCinta.toUpperCase(), datos);
            enviarTecla(KeyEvent.VK_SPACE);
        } while (hayMas);

        enviarTecla(KeyEvent.VK_ENTER);

        return datos;
    }

    /**
     * Introduce una espera
     * @param tRetardo tiempo en milisegundos 
     */
    private void retardo(int tRetardo) {
        try {
            Thread.sleep(tRetardo);
        } catch (InterruptedException ex) {
            Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
